package net.lucamasini.fantacalcio.gwt.client;

import net.lucamasini.fantacalcio.gwt.client.event.*;
import net.lucamasini.fantacalcio.gwt.client.presenter.*;
import net.lucamasini.fantacalcio.gwt.client.view.*;
import net.lucamasini.fantacalcio.server.service.*;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.ui.RootPanel;

public class Fantacalcio implements EntryPoint {

	private final SquadraServiceAsync squadraService = GWT.create(SquadraService.class);
	private final GiornataServiceAsync giornataService = GWT.create(GiornataService.class);
	
	final private ClassificaPresenter classificaPresenter = new ClassificaPresenter(new ClassificaPanel());
	final private CreaPronosticoPresenter creaPronosticoPresenter = new CreaPronosticoPresenter(new CreaPronosticoPanel());
	final private GiornataPresenter nuovaGiornataPresenter = new GiornataPresenter(new GiornataPanel(), giornataService);
	final private AggiornaRisultatiPresenter aggiornaRisultatiPresenter = new AggiornaRisultatiPresenter(new AggiornaRisultatiPanel());
	final private GiocatoriPresenter giocatoriPresenter = new GiocatoriPresenter(new GiocatoriPanel(), squadraService);
	
	@Override
	public void onModuleLoad() {
		
		bindEvents();
		
		Element loading = Document.get().getElementById("loading");
		loading.getParentElement().removeChild(loading);

		getEventBus().fireEvent(new HomeEvent());
	}

    private static HandlerManager eventBus = new HandlerManager(null);

    public static HandlerManager getEventBus() {
        return eventBus;
    }
    
    private void bindEvents() {

        getEventBus().addHandler(CreaPronosticoEvent.TYPE, new CreaPronosticoEventHandler() {
            @Override
            public void onCreaPronostico(CreaPronosticoEvent
                    event) {
            	creaPronosticoPresenter.creaPronostico();
            }
        });
    	
		getEventBus().addHandler(HomeEvent.TYPE, new HomeEventHandler() {
            @Override
            public void onHome(HomeEvent
                    event) {
            	creaPronosticoPresenter.go(RootPanel.get("content"));
            }
        });
        getEventBus().addHandler(ClassificaEvent.TYPE, new ClassificaEventHandler() {

			@Override
			public void onClassifica(ClassificaEvent event) {
				classificaPresenter.go(RootPanel.get("content"));
			}
        });
        getEventBus().addHandler(NuovaGiornataEvent.TYPE, new NuovaGiornataEventHandler() {

			@Override
			public void onNuovaGiornata(NuovaGiornataEvent event) {
				nuovaGiornataPresenter.go(RootPanel.get("content"));
			}
        });
        getEventBus().addHandler(ShowAggiornaRisultatiEvent.TYPE, new ShowAggiornaRisultatiEventHandler() {

			@Override
			public void onShowAggiornaRisultati(ShowAggiornaRisultatiEvent event) {
				aggiornaRisultatiPresenter.go(RootPanel.get("content"));
				
			}
        });
        getEventBus().addHandler(ShowGiocatoriEvent.TYPE, new ShowGiocatoriEventHandler() {

			@Override
			public void onShowGiocatori(ShowGiocatoriEvent event) {
				giocatoriPresenter.go(RootPanel.get("content"));
			}
        });
        getEventBus().addHandler(NuovaSquadraEvent.TYPE, new NuovaSquadraEventHandler() {

			@Override
			public void onNuovaSquadra(NuovaSquadraEvent event) {
				giocatoriPresenter.creaNuovoGiocatore();
			}
        });
        getEventBus().addHandler(AggiornaSquadraEvent.TYPE, new AggiornaSquadraEventHandler() {

			@Override
			public void onAggiornaSquadra(AggiornaSquadraEvent event) {
				giocatoriPresenter.aggiornaSquadra();
			}
        });
        getEventBus().addHandler(CancellaSquadraEvent.TYPE, new CancellaSquadraEventHandler() {

			@Override
			public void onCancellaSquadra(CancellaSquadraEvent event) {
				giocatoriPresenter.cancellaSquadraSelezionata();
			}
        });
    }
}
